<?xml version="1.0"?>

<st-source>
<time-stamp>From VisualWorks® NonCommercial, 7.6 of March 3, 2008 on April 16, 2012 at 12:49:38 pm</time-stamp>
<!-- Package ProjetPoker* -->


<class>
<name>Poker</name>
<environment>Smalltalk</environment>
<super>Core.Object</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category></category>
<attributes>
<package>ProjetPoker</package>
</attributes>
</class>

<class>
<name>Main</name>
<environment>Smalltalk</environment>
<super>Core.Object</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>cartes type valeur </inst-vars>
<class-inst-vars>regles </class-inst-vars>
<imports></imports>
<category></category>
<attributes>
<package>ProjetPoker</package>
</attributes>
</class>

<comment>
<class-id>Main</class-id>
<body>Main est la classe qui permet de déterminer le type d'une main, ainsi que de comparer 2 mains

Instance Variables
	cartes	&lt;Object | ProtoObject&gt; cartes

</body>
</comment>

<class>
<name>PaquetDeCartes</name>
<environment>Smalltalk</environment>
<super>Core.Object</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>cartes nbCartesVisibles </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category></category>
<attributes>
<package>ProjetPoker</package>
</attributes>
</class>

<class>
<name>Carte</name>
<environment>Smalltalk</environment>
<super>Core.Object</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>couleur valeur </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category></category>
<attributes>
<package>ProjetPoker</package>
</attributes>
</class>

<class>
<name>JeuDeCartes</name>
<environment>Smalltalk</environment>
<super>Core.Object</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>jeu </inst-vars>
<class-inst-vars>couleurs valeurs cartesSpeciales </class-inst-vars>
<imports></imports>
<category></category>
<attributes>
<package>ProjetPoker</package>
</attributes>
</class>

<comment>
<class-id>JeuDeCartes</class-id>
<body>JeuDeCarte implémente un jeu de cartes à partir d'un ensemble de couleur, de valeurs et de carte spéciales.
Il représente les cartes restantes (à distribuer) du jeu.

Instance Variables
	jeu	&lt;OrderedCollection&gt;	 ensemble des cartes du jeu.

</body>
</comment>

<class>
<name>PartiePoker</name>
<environment>Smalltalk</environment>
<super>Poker</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>jeu joueurs main tour </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category></category>
<attributes>
<package>ProjetPoker</package>
</attributes>
</class>

<class>
<name>Joueur</name>
<environment>Smalltalk</environment>
<super>PokerController</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>argent nom statut parole main mise </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category></category>
<attributes>
<package>ProjetPoker</package>
</attributes>
</class>








<methods>
<class-id>PaquetDeCartes class</class-id> <category>instance creation</category>

<body package="ProjetPoker" selector="getOne">getOne
	
	| tmp |
	tmp := self new.
	Carte couleurs
		do:
			[:uneCouleur | 
			Carte valeurs
				do:
					[:uneValeur | tmp cartes add: (Carte couleur: uneCouleur valeur: uneValeur)]].
	^tmp</body>

<body package="ProjetPoker" selector="new">new
	"Answer a newly created and initialized instance."

	^super new initialize</body>
</methods>


<methods>
<class-id>PaquetDeCartes</class-id> <category>accessing</category>

<body package="ProjetPoker" selector="nbCartesVisibles">nbCartesVisibles
	^nbCartesVisibles</body>

<body package="ProjetPoker" selector="cartes:">cartes: anObject
	cartes := anObject</body>

<body package="ProjetPoker" selector="nbCartesVisibles:">nbCartesVisibles: anObject
	nbCartesVisibles := anObject</body>

<body package="ProjetPoker" selector="base">base

^cartes first</body>

<body package="ProjetPoker" selector="taille">taille

^self cartes size</body>

<body package="ProjetPoker" selector="cartes">cartes
	^cartes</body>

<body package="ProjetPoker" selector="sommet">sommet

^cartes last</body>
</methods>

<methods>
<class-id>PaquetDeCartes</class-id> <category>testing</category>

<body package="ProjetPoker" selector="estVide">estVide

^self taille = 0</body>
</methods>

<methods>
<class-id>PaquetDeCartes</class-id> <category>copying</category>

<body package="ProjetPoker" selector="copy">copy

| tmp |
	tmp := super copy.
tmp cartes: self cartes copy.
^tmp </body>
</methods>

<methods>
<class-id>PaquetDeCartes</class-id> <category>sorting</category>

<body package="ProjetPoker" selector="retire">retire

^self cartes removeLast</body>

<body package="ProjetPoker" selector="ajouteToutes:">ajouteToutes:t

t cartes do:[:c| self cartes add: c].
self nbCartesVisibles: self nbCartesVisibles + t taille .
t initialize.</body>

<body package="ProjetPoker" selector="melanger">melanger
	
	| random c |
	random := Random new.
	c := OrderedCollection new.
	self cartes size
		timesRepeat:
			[c
				add:
					(self cartes removeAtIndex: (random next * self cartes size) ceiling)].
	self cartes: c</body>

<body package="ProjetPoker" selector="ajoute:">ajoute:c

self cartes add: c</body>
</methods>

<methods>
<class-id>PaquetDeCartes</class-id> <category>initialize-release</category>

<body package="ProjetPoker" selector="initialize">initialize
	"Initialize a newly created instance. This method must answer the receiver."
	" *** Edit the following to properly initialize instance variables ***"
	
	cartes := OrderedCollection new.	" *** And replace this comment with additional initialization code *** "
	nbCartesVisibles := 0.
	^self</body>
</methods>

<methods>
<class-id>PaquetDeCartes</class-id> <category>printing</category>

<body package="ProjetPoker" selector="printOn:">printOn: aStream
	
	aStream nextPut: $[.
	self cartes do:[:uneCarte| uneCarte printOn: aStream. aStream cr].
aStream nextPut:$]</body>
</methods>


<methods>
<class-id>Main class</class-id> <category>testing</category>

<body package="ProjetPoker" selector="testPaires">testPaires

	| c1 c2 c3 c4 c5 cc m |
	c1 := Carte newCouleur: #coeur valeur: 2.
	c2 := Carte newCouleur: #carreau valeur: 2.
	c3 := Carte newCouleur: #pique valeur: 4.
	c4 := Carte newCouleur: #trefle valeur: 4.
	c5 := Carte newCouleur: #coeur valeur: 6.
	cc := OrderedCollection new.
	cc addLast: c1.
	cc addLast: c2.
	cc addLast: c3.
	cc addLast: c4.
	cc addLast: c5.
	m := Main new: cc.
	^m detecterPaires</body>

<body package="ProjetPoker" selector="testMemeValeur">testMemeValeur

	| c1 c2 c3 c4 c5 cc m |
	c1 := Carte newCouleur: #coeur valeur: 2.
	c2 := Carte newCouleur: #carreau valeur: 2.
	c3 := Carte newCouleur: #pique valeur: 4.
	c4 := Carte newCouleur: #trefle valeur: 4.
	c5 := Carte newCouleur: #coeur valeur: 4.
	cc := OrderedCollection new.
	cc addLast: c1.
	cc addLast: c2.
	cc addLast: c3.
	cc addLast: c4.
	cc addLast: c5.
	m := Main new: cc.
	^m detecterMemeValeur: 3</body>

<body package="ProjetPoker" selector="testFiltreValeur">testFiltreValeur

	| c1 c2 c3 c4 c5 cc |
	c1 := Carte newCouleur: #coeur valeur: 2.
	c2 := Carte newCouleur: #carreau valeur: 2.
	c3 := Carte newCouleur: #pique valeur: 4.
	c4 := Carte newCouleur: #trefle valeur: 4.
	c5 := Carte newCouleur: #coeur valeur: 6.
	cc := OrderedCollection new.
	cc addLast: c1.
	cc addLast: c2.
	cc addLast: c3.
	cc addLast: c4.
	cc addLast: c5.
	^Main filtrerValeur: 4 parmi: cc</body>

<body package="ProjetPoker" selector="testCouleur">testCouleur

	| c1 c2 c3 c4 c5 c6 cc m |
	c1 := Carte newCouleur: #coeur valeur: 2.
	c2 := Carte newCouleur: #coeur valeur: 3.
	c3 := Carte newCouleur: #coeur valeur: 4.
	c4 := Carte newCouleur: #coeur valeur: 5.
	c5 := Carte newCouleur: #coeur valeur: 6.
	c6 := Carte newCouleur: #trefle valeur: 6.
	cc := OrderedCollection new.
	cc addLast: c1.
	cc addLast: c2.
	cc addLast: c3.
	cc addLast: c4.
	cc addLast: c5.
	cc addLast: c6.
	m := Main new: cc.
	^m detecterCouleur</body>
</methods>

<methods>
<class-id>Main class</class-id> <category>instance creation</category>

<body package="ProjetPoker" selector="new">new
	"Renvoie une instance de Main initialisée par défaut."

	^super new initialize</body>

<body package="ProjetPoker" selector="regles:">regles: aDictionary

	regles := aDictionary</body>

<body package="ProjetPoker" selector="new:">new: cartes
	"Renvoie une instance de Main initialisée par 5 cartes"

	| obj |
	obj := Main new.
	obj initialize: cartes.
	^obj</body>

<body package="ProjetPoker" selector="reglesParDefaut">reglesParDefaut

	| bloc |
	bloc :=
			[:cartes |
			| out |
			out := OrderedCollection new.
			JeuDeCartes couleurs do: 
					[:co |
					out addLast: 0.
					cartes do: [:ca | ca couleur = co ifTrue: [out last: out last + 1]]]]</body>
</methods>

<methods>
<class-id>Main class</class-id> <category>detecting</category>

<body package="ProjetPoker" selector="filtrerValeur:parmi:">filtrerValeur: valeur parmi: cartes

	| resultat blocComparerValeur |
	resultat := OrderedCollection new.
	resultat addAll: cartes.
	blocComparerValeur := [:n | n valeur ~= valeur].
	resultat removeAllSuchThat: blocComparerValeur.
	^resultat</body>
</methods>


<methods>
<class-id>Main</class-id> <category>detecting</category>

<body package="ProjetPoker" selector="detecterMemeValeur:">detecterMemeValeur: nbCartes

	| cartesRestantes carte resultat tmp max |
	max := 0.
	cartesRestantes := cartes.
	[cartesRestantes isEmpty] whileFalse: 
			[carte := cartesRestantes first.
			cartesRestantes removeFirst.
			tmp := Main filtrerValeur: carte valeur parmi: cartesRestantes.
			cartesRestantes removeAllSuchThat: [:n | tmp includes: n].
			tmp size + 1 = nbCartes
				ifTrue: 
					[max &lt; carte indexValeur
						ifTrue: 
							[max := carte indexValeur.
							resultat := tmp.
							resultat addFirst: carte]]].
	^resultat</body>

<body package="ProjetPoker" selector="detecterCouleur">detecterCouleur
	"Détecte si la main est une couleur. Renvoie les cartes constituant la couleur, nil si pas de couleur"
	"On compte d'abord les cartes par couleur :"

	| blocCompterCartesMemeCouleur blocComparerCouleur comptes couleur resultat |
	blocCompterCartesMemeCouleur :=
			[:co |
			| n |
			n := 0.
			cartes do: [:c | c couleur = co ifTrue: [n := n + 1]].
			n].
	comptes := JeuDeCartes couleurs
				collect: [:co | blocCompterCartesMemeCouleur value: co].

	"On cherche la couleur pour laquelle on a (au moins) 5 cartes de même couleur :"
	1 to: comptes size do: [:n | (comptes at: n) &gt;= 5 ifTrue: [couleur := n]].

	"On collecte les cartes en question et on les retourne :"
	blocComparerCouleur := [:n | n couleur ~= (JeuDeCartes couleurs at: couleur)].
	couleur isNil
		ifFalse: 
			[resultat := cartes.
			resultat removeAllSuchThat: blocComparerCouleur].
	^resultat</body>

<body package="ProjetPoker" selector="detecter:">detecter: figure
	</body>

<body package="ProjetPoker" selector="valeur">valeur
	
	| res val sVal coul |
	res := SortedCollection
		sortBlock:
			[:a :b | a key &gt; b key | (a key = b key &amp; (a value  &gt; b value ))].
	val := self cartes cartes collect: [:a | a rang].
	sVal := val asSortedCollection.
	coul := self cartes cartes collect: [:a | a couleur].
	val asSet asSortedCollection
		do: [:c | res add: (val occurrencesOf: c) -&gt; c	"paire brelan ou carre"].
	coul size = 1
		ifTrue:
			[sVal last - sVal first = 4
				ifTrue: [res add: 5 -&gt; sVal last]
				ifFalse: [res add: 3.5 -&gt; sVal last	"couleur"]	"quinte"]

.

^res</body>

<body package="ProjetPoker" selector="&lt;=">&lt;= autreMain
	
	| a b |
	a := self valeur.
	b := autreMain valeur.
	a first key &lt; b first key ifTrue: [^true].	" cas simple"
a first key &gt; b first key ifTrue:[^false].
	^a first key &gt; 1  
		ifFalse:[(a inject:0 into:[:q :s| q  *20 +s value ]) &lt;(b inject:0 into:[:q :s| q  *20 +s value ])]
		ifTrue:
			[(b at: 2) key = 2
				ifTrue:
					[(a at: 2) key &lt; 2
						ifTrue: [^true]
						ifFalse:
							[" la premiere paire de b bat la premiere paire de a"
							a first value  &lt; b first value 
								ifTrue: [^true]
								ifFalse:
									[" les deux premieres paires sont identiques"
									a first value  = b first value 
										ifTrue: [(a at: 2) value  &lt; (b at: 2) value ]
										ifFalse:
											[" la premiere paire de a bat la premiere paire de b"
											^false]]]	" a n'a pas de deuxieme paire"]
				ifFalse:
					[(a at: 2) key = 2
						ifTrue: [^true]
						ifFalse: [^a first value  &lt; b first value ]	" a un full vs brelan ou une double paire vs paire"]	"b a une deuxieme paire"]	" Ils ont chacun un brelan, une paire, un full ou deux paires"</body>

<body package="ProjetPoker" selector="detecterPaires">detecterPaires

	| cartesRestantes paires carte autreCarte |
	cartesRestantes := cartes.
	paires := OrderedCollection new.
	[cartesRestantes isEmpty] whileFalse: 
			[carte := cartesRestantes first.
			cartesRestantes removeFirst.
			autreCarte := nil.
			cartesRestantes do: [:c | (c memeValeur: carte) ifTrue: [autreCarte := c]].
			autreCarte isNil
				ifFalse: 
					[paires addLast: carte.
					paires addLast: autreCarte.
					cartesRestantes remove: autreCarte]].
	^paires</body>
</methods>

<methods>
<class-id>Main</class-id> <category>accessing</category>

<body package="ProjetPoker" selector="cartes:">cartes: anObject
	cartes := anObject</body>

<body package="ProjetPoker" selector="copy">copy

| tmp |
	tmp := super copy.
tmp cartes: self cartes copy.
^tmp</body>

<body package="ProjetPoker" selector="cartes">cartes
	^cartes</body>
</methods>

<methods>
<class-id>Main</class-id> <category>As yet unclassified</category>

<body package="ProjetPoker" selector="nbCartesVisibles:">nbCartesVisibles: aSmallInteger 
	self halt</body>
</methods>

<methods>
<class-id>Main</class-id> <category>initialize-release</category>

<body package="ProjetPoker" selector="initialize">initialize
	"Initialise une main par défaut"

cartes := PaquetDeCartes new.
	"super initialize."
	^self</body>

<body package="ProjetPoker" selector="initialize:">initialize: c
	"Initialise une main avec 5 cartes"

	super initialize.
	cartes := c.
	^self</body>
</methods>


<methods>
<class-id>Joueur class</class-id> <category>instance creation</category>

<body package="ProjetPoker" selector="nom:argent:statut:parole:main:">nom: unNom argent: uneSomme statut: unStatut parole: uneParole main: uneMain

	^(Joueur new)
		argent: uneSomme;
		nom: unNom;
		statut: unStatut;
		parole: uneParole;
		main: uneMain</body>

<body package="ProjetPoker" selector="nom:argent:statut:parole:main:mise:">nom: unNom argent: uneSomme statut: unStatut parole: uneParole main: uneMain mise: uneMise

	^(Joueur new)
		argent: uneSomme;
		nom: unNom;
		statut: unStatut;
		parole: uneParole;
		main: uneMain;
		mise: uneMise</body>

<body package="ProjetPoker" selector="nom:argent:statut:parole:">nom: unNom argent: uneSomme statut: unStatut parole: uneParole

	^(Joueur new)
		argent: uneSomme;
		nom: unNom;
		statut: unStatut;
		parole: uneParole</body>

<body package="ProjetPoker" selector="nom:argent:statut:parole:mise:">nom: unNom argent: uneSomme statut: unStatut parole: uneParole mise: uneMise

	^(Joueur new)
		argent: uneSomme;
		nom: unNom;
		statut: unStatut;
		parole: uneParole;
		mise: uneMise</body>
</methods>


<methods>
<class-id>Joueur</class-id> <category>accessing</category>

<body package="ProjetPoker" selector="argent:">argent: anObject

	argent := anObject</body>

<body package="ProjetPoker" selector="argent">argent

	^argent</body>

<body package="ProjetPoker" selector="main:">main: anObject

	main := anObject</body>

<body package="ProjetPoker" selector="nom:">nom: anObject

	nom := anObject</body>

<body package="ProjetPoker" selector="parole">parole

	^parole</body>

<body package="ProjetPoker" selector="nom">nom

	^nom</body>

<body package="ProjetPoker" selector="statut">statut

	^statut</body>

<body package="ProjetPoker" selector="mise">mise

	^mise</body>

<body package="ProjetPoker" selector="parole:">parole: anObject

	parole := anObject</body>

<body package="ProjetPoker" selector="main">main

	^main</body>

<body package="ProjetPoker" selector="mise:">mise: anObject

	mise := anObject</body>

<body package="ProjetPoker" selector="statut:">statut: anObject

	statut := anObject.
statut = #local ifFalse:[ main cartes nbCartesVisibles:0] ifTrue:[ main cartes  nbCartesVisibles:2]</body>
</methods>

<methods>
<class-id>Joueur</class-id> <category>initialize-release</category>

<body package="ProjetPoker" selector="initialize">initialize
	"Initialize a newly created instance. This method must answer the receiver."

	super initialize.
	" *** Replace this comment with the appropriate initialization code *** "
	nom := String new.
	statut := Symbol new.
	main := Main new.
	parole := Symbol new.
	mise := 0.
	^self</body>
</methods>


<methods>
<class-id>Poker class</class-id> <category>instance creation</category>

<body package="ProjetPoker" selector="new">new
	"Answer a newly created and initialized instance."

	^super new initialize</body>
</methods>


<methods>
<class-id>Poker</class-id> <category>initialize-release</category>

<body package="ProjetPoker" selector="initialize">initialize
	"Initialize a newly created instance. This method must answer the receiver."

	"super initialize."
	" *** Replace this comment with the appropriate initialization code *** "
	^self</body>
</methods>


<methods>
<class-id>PartiePoker class</class-id> <category>testing</category>

<body package="ProjetPoker" selector="ex1">ex1

	| col leo dany julien cedric Mhammed pierre jean yves tmp |
	col := OrderedCollection new.
	leo := Joueur
				nom: 'leo'
				argent: 3500
				statut: #local
				parole: #nothing
mise:900.
	dany := Joueur
				nom: 'dany'
				argent: 3500
				statut: #other
				parole: #call
				mise: 900.
	julien := Joueur
				nom: 'julien'
				argent: 3500
				statut: #other
				parole: #call
mise: 900.
	cedric := Joueur
				nom: 'cedric'
				argent: 3500
				statut: #other
				parole: #fold .
	Mhammed := Joueur
				nom: 'Mhammed'
				argent: 3500
				statut: #other
				parole: #call
				mise: 900.
	pierre := Joueur
				nom: 'pierre'
				argent: 3500
				statut: #other
				parole: #fold.
	jean := Joueur
				nom: 'jean'
				argent: 3500
				statut: #other
				parole: #call
mise: 900.
	yves := Joueur
				nom: 'yves'
				argent: 3500
				statut: #other
				parole: #fold.
	col add: leo.
	col add: dany.
	col add: julien.
	col add: cedric.
	col add: Mhammed.
	col add: pierre.
	col add: jean.
	col add: yves.
tmp := self new.

tmp joueurs: col.
tmp distribuer.
^tmp</body>

<body package="ProjetPoker" selector="ex2">ex2
self ex1 open</body>
</methods>


<methods>
<class-id>PartiePoker</class-id> <category>accessing</category>

<body package="ProjetPoker" selector="main">main

	^main</body>

<body package="ProjetPoker" selector="jeu">jeu

	^jeu</body>

<body package="ProjetPoker" selector="jeu:">jeu: anObject

	jeu := anObject</body>

<body package="ProjetPoker" selector="main:">main: anObject

	main := anObject</body>

<body package="ProjetPoker" selector="joueurs">joueurs

	^joueurs</body>

<body package="ProjetPoker" selector="joueurs:">joueurs: anObject

	joueurs := anObject</body>
</methods>

<methods>
<class-id>PartiePoker</class-id> <category>user interface</category>

<body package="ProjetPoker" selector="openPourJoueur:">openPourJoueur: unJoueur
	
	| ui |
	ui := UIPoker new.
	ui table model: self.
	ui joueur: unJoueur.
	ui open</body>

<body package="ProjetPoker" selector="open">open
^self openPourJoueur:(self joueurs detect:[:a| a statut= #local])</body>
</methods>

<methods>
<class-id>PartiePoker</class-id> <category>jeu - testing</category>

<body package="ProjetPoker" selector="verifierJoueur">verifierJoueur
	"Verifier que tous les joueurs ont joué. Certains peuvent abandonner"

	[((self joueurs reject: [:j | j parole = #fold]) collect: [:j | j mise])
		asSet size = 1]
		whileFalse:
			[Processor
				yield;
				yield.
			(Delay forMilliseconds: 10000) wait.
			self verifierJoueur]</body>
</methods>

<methods>
<class-id>PartiePoker</class-id> <category>jeu</category>

<body package="ProjetPoker" selector="tourSuivant">tourSuivant

self main cartes nbCartesVisibles: self main cartes nbCartesVisibles + 1</body>

<body package="ProjetPoker" selector="premierTour">premierTour 

self main cartes nbCartesVisibles: 3</body>

<body package="ProjetPoker" selector="avancer">avancer
	
	self verifierJoueur.
	tour = 0
		ifTrue: [self premierTour]
		ifFalse:
			[tour = 3
				ifTrue: [self fin]
				ifFalse: [self tourSuivant]].
	tour := tour + 1</body>

<body package="ProjetPoker" selector="fin">fin
	
	| tmp |
	self joueurs do: [:a | self meilleureMainDe: a].

self halt. 
	tmp := SortedCollection sortBlock: [:a :b | a main &lt;= b main].
	tmp addAll: self joueurs.
	Dialog warn: tmp last nom , ' a gagne'.
	tmp last inspect</body>

<body package="ProjetPoker" selector="meilleureMainDe:">meilleureMainDe: joueur
	
	| laMainDuJoueur col tmp |
	laMainDuJoueur := Main new.
	laMainDuJoueur cartes cartes addAll: self main cartes cartes.
	laMainDuJoueur cartes ajouteToutes: joueur main cartes.
 	col := OrderedCollection new.
	1
		to: 7
		do:
			[:a | 
			1
				to: 6
				do:
					[:b | 
					tmp := laMainDuJoueur copy.
					tmp cartes cartes removeAtIndex: a.
					tmp cartes cartes removeAtIndex: b.
					col add: tmp]].
	joueur main: col asSortedCollection last</body>
</methods>

<methods>
<class-id>PartiePoker</class-id> <category>initialize-release</category>

<body package="ProjetPoker" selector="distribuer">distribuer
	
	self joueurs do: [:a | a main cartes ajoute: self jeu retire].
	self joueurs do: [:a | a main cartes ajoute: self jeu retire].
	self distribuerTapis</body>

<body package="ProjetPoker" selector="initialize">initialize
	"Initialize a newly created instance. This method must answer the receiver."

	super initialize.
	" *** Replace this comment with the appropriate initialization code *** "
	jeu := PaquetDeCartes getOne melanger.
	main := Main new.
	joueurs := OrderedCollection new.
	tour :=0.
	^self</body>

<body package="ProjetPoker" selector="distribuerTapis">distribuerTapis
	self main cartes nbCartesVisibles:0.
	5 timesRepeat:[ self main cartes ajoute: self jeu retire.]</body>
</methods>


<methods>
<class-id>Carte class</class-id> <category>constants</category>

<body package="ProjetPoker" selector="couleursRouges">couleursRouges

^#(Coeur   Carreau  )</body>

<body package="ProjetPoker" selector="valeurs">valeurs

^#( 2 3 4 5 6 7 8 9 10 Valet Dame Roi As)</body>

<body package="ProjetPoker" selector="couleursNoires">couleursNoires

^#(Pique Treffle      )</body>

<body package="ProjetPoker" selector="couleursOpposees:">couleursOpposees: c

^(self couleursRouges includes:c) ifTrue:[self couleursNoires] ifFalse:[self couleursRouges]</body>

<body package="ProjetPoker" selector="couleurs">couleurs

^#(Coeur Pique Carreau Treffle)</body>
</methods>

<methods>
<class-id>Carte class</class-id> <category>instance creation</category>

<body package="ProjetPoker" selector="new">new
	"Answer a newly created and initialized instance."

	^super new initialize</body>

<body package="ProjetPoker" selector="couleur:valeur:">couleur: c valeur: v
	
	^(self new)
		couleur: c;
		valeur: v</body>
</methods>


<methods>
<class-id>Carte</class-id> <category>comparing</category>

<body package="ProjetPoker" selector="&lt;=">&lt;= unObjet
unObjet class = self class ifFalse:[^true].
^self rang  &lt;= unObjet rang</body>
</methods>

<methods>
<class-id>Carte</class-id> <category>accessing</category>

<body package="ProjetPoker" selector="valeur">valeur
	^valeur</body>

<body package="ProjetPoker" selector="rang">rang


^self class valeurs indexOf: self valeur</body>

<body package="ProjetPoker" selector="couleur">couleur
	^couleur</body>

<body package="ProjetPoker" selector="couleur:">couleur: anObject
	couleur := anObject</body>

<body package="ProjetPoker" selector="valeur:">valeur: anObject
	valeur := anObject</body>
</methods>

<methods>
<class-id>Carte</class-id> <category>testing</category>

<body package="ProjetPoker" selector="estRouge">estRouge 

^self class couleursRouges includes: self couleur</body>

<body package="ProjetPoker" selector="estNoir">estNoir

^self class couleursNoires includes: self couleur</body>

<body package="ProjetPoker" selector="estDeCouleurOpposeeA:">estDeCouleurOpposeeA: c

^self estNoir xor:[c estRouge]</body>
</methods>

<methods>
<class-id>Carte</class-id> <category>printing</category>

<body package="ProjetPoker" selector="printOn:">printOn: aStream
	
	self valeur printOn: aStream.
	aStream tab.
	self couleur printOn: aStream.
	aStream cr</body>
</methods>

<methods>
<class-id>Carte</class-id> <category>initialize-release</category>

<body package="ProjetPoker" selector="initialize">initialize
	"Initialize a newly created instance. This method must answer the receiver."

	" *** Edit the following to properly initialize instance variables ***"
	couleur := nil.
	valeur := nil.
	" *** And replace this comment with additional initialization code *** "
	^self</body>
</methods>


<methods>
<class-id>JeuDeCartes class</class-id> <category>accessing</category>

<body package="ProjetPoker" selector="cartesSpeciales:">cartesSpeciales: anObject

	cartesSpeciales := anObject</body>

<body package="ProjetPoker" selector="valeurs:">valeurs: anObject

	valeurs := anObject</body>

<body package="ProjetPoker" selector="valeurs">valeurs

	^valeurs</body>

<body package="ProjetPoker" selector="cartesSpeciales">cartesSpeciales

	^cartesSpeciales</body>

<body package="ProjetPoker" selector="couleurs:">couleurs: anObject

	couleurs := anObject</body>

<body package="ProjetPoker" selector="couleurs">couleurs

	^couleurs</body>
</methods>

<methods>
<class-id>JeuDeCartes class</class-id> <category>instance creation</category>

<body package="ProjetPoker" selector="new">new
	"Définit par défaut un jeu standard de 52 cartes"
	"Renvoie une instance de JeuDeCarte avec un jeu mélangé"

	couleurs isNil ifTrue: [couleurs := #(#coeur #carreau #trefle #pique)].
	valeurs isNil
		ifTrue: [valeurs := #(2 3 4 5 6 7 8 9 10 #valet #dame #roi #as)].
	"valeurs définit à la fois les differentes valeurs possibles d'une carte, et la relation d'ordre entre les valeurs (de la plus faible à la plus forte)"
	cartesSpeciales isNil ifTrue: [cartesSpeciales := #()].
	^super new initialize</body>
</methods>


<methods>
<class-id>JeuDeCartes</class-id> <category>accessing</category>

<body package="ProjetPoker" selector="distribuer:">distribuer: carteOuverte
	"Distribue la première carte du jeu"

	| carte |
	jeu isEmpty ifTrue: [^nil].
	carte := jeu first.
	jeu removeFirst.
	carte ouverte: carteOuverte.
	^carte</body>

<body package="ProjetPoker" selector="jeu">jeu

	^jeu</body>

<body package="ProjetPoker" selector="jeu:">jeu: anObject

	jeu := anObject</body>
</methods>

<methods>
<class-id>JeuDeCartes</class-id> <category>initialize-release</category>

<body package="ProjetPoker" selector="initialize">initialize
	"Crée un jeu de carte et le mélange (appelé automatiquement par le constructeur)"

	| random tmp |
	"super initialize."
	"Création du jeu dans tmp:"
	jeu := OrderedCollection new.
	tmp := OrderedCollection new.
	JeuDeCartes couleurs
		do: [:n | JeuDeCartes valeurs do: [:m | tmp addLast: (Carte couleur: n valeur: m)]].
	JeuDeCartes cartesSpeciales
		do: [:n | tmp addLast: (Carte couleur: nil valeur: n)].

	"Mélange du jeu :"
	random := Random new.
	1 to: tmp size
		do: 
			[:i |
			| n |
			n := (random next * (tmp size - 1)) rounded + 1.
			jeu addLast: (tmp at: n).
			tmp removeAtIndex: n].
	^self</body>
</methods>



</st-source>
